<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>

  <body>
    <script>
      /*   //请实现以下效果
              function add (a, b, c) {
                  return a + b + c
              }
              // console.log(add.length);

              const res = add(1, 2, 3) //6

              //要求声明一个curry函数，函数add经过curry函数的处理后，每次调用只能接收一个参数
              const curry = () => { }


              let addCurry = curry(add)

              // console.log(addCurry);
              const res2 = addCurry(1)(2)(3) //6

              console.log(res2); */

      // let arr = [1, 2, 3, 4, 5, 5]
      // const arr2 = arr.slice(1, 4)
      // console.log(arr.slice(1, 6))

      // 函数柯里化
      // 柯里化通常也称部分求值，其含义是给函数分步传递参数,
      // 每次传递参数进行处理，并返回一个更具体的函数接受剩下的参数
      // 这中间可嵌套多层这样的接收部分参数函数，直至返回最后结果。
      // 指的是将一个接受多个参数的函数 变为接受一个参数返回一个函数的固定形式
      // 给函数分布传递参数

      // 1
      function add(x, y) {
        return x + y
      }
      console.log(add(1, 4))

      //2
      function add2(x) {
        return function (y) {
          return x + y
        }
      }
      console.log(add2(1)(8))

      //函数柯里化
      const sumFn = (...args) => {
        return args.reduce((prev, item) => {
          return prev + item
        }, 0)
      }
      let currying = function (func) {
        const args = []
        return function result(...rest) {
          if (rest.length === 0) {
            return func(...args)
          } else {
            args.push(...rest)
            return result
          }
        }
      }
      console.log(currying(sumFn)(1)(2)(3)()) //6
      console.log(currying(sumFn)(1, 2)(3, 4)(5)()) // 15
      console.log(currying(sumFn)(1)(2, 3, 4, 5)(6)()) // 21

      /* const a = add(1, 5)
            console.log(a)
            console.log(add(1, 5)) */
    </script>
  </body>
</html>
